package main

import "fmt"

//注意切片在包作用域是无法只定义不声明值　var s1 []int　这种是不行的

//切片初始化赋值，var 变量名　[]类型{值....}
var b1 = []int{1, 2}

func main() {

	//只定义没有赋值的切片就是空，在go中切片没值就是为空．和java有区别
	var b2 []int
	fmt.Println("b2:", b2)
	fmt.Println("b2是否为nil:", b2 == nil)
	fmt.Println("b2的长度:", len(b2))

	//初始化
	b3 := []int{2, 3}
	fmt.Println("b3:", b3)
	fmt.Println("b3是否为nil:", b3 == nil)
	fmt.Println("b3的长度:", len(b3))

	// 长度和容量
	fmt.Printf("len(b2):%d cap(b2):%d\n", len(b2), cap(b2))
	fmt.Printf("len(b1):%d cap(b1):%d\n", len(b3), cap(b3))

	//由数组转切片
	f1 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
	var b4 []int
	b4 = f1[:]
	//就是把整个数组赋值切片了
	//直接赋值 [1 2 3 4 5 6 7 8 9]
	fmt.Println("直接赋值", b4)
	//重新赋值
	f1 = [9]int{0: 1, 8: 1}
	//修改了底层数组，f1数组的值 [1 0 0 0 0 0 0 0 1]
	fmt.Println("修改了底层数组，f1数组的值", f1)
	//实际上切片是没有进行操作的，但是底层数组进行了更改，上层切换也进行了更改
	//修改了底层数组之后，封装了这个数组的切片的值 [1 0 0 0 0 0 0 0 1]
	fmt.Println("修改了底层数组之后，封装了这个数组的切片的值", b4)

	//数组切出切片
	//基于一个数组切割，左包含右不包含，（左闭右开）
	//切片的容量是指底层数组的容量
	//切片的容量是底层数组从切片的第一个元素到最后一个元素的数量。
	//容量和长度都是1开始计算的，不是0哦

	// 索引0~3
	b5 := f1[0:4]
	fmt.Println("f5", b5)
	fmt.Printf("len(s6):%d cap(s6):%d\n", len(b5), cap(b5))

	//索引1~3
	//因为切换时从1索引开始切的 ，切片的容量是 12345678  1开始到最后8结束
	b6 := f1[1:4]
	fmt.Println("f5", b6)
	//len(s6):3 cap(s6):8
	fmt.Printf("len(s6):%d cap(s6):%d\n", len(b6), cap(b6))

}
